package com.insight.modules.system.util;

import com.insight.common.util.oConvertUtils;
import com.insight.modules.system.entity.SysPermission;

import java.util.List;

/**
 * 权限数据工具类
 * <p>
 * 主要用于智能处理权限相关数据，简化用户错误操作，
 * 并辅助菜单首页的检测和添加。
 * </p>
 *
 * @author scott
 * @date 2019-04-03
 */
public class PermissionDataUtil {

	/**
	 * 智能处理权限数据中的错误和规范问题
	 * <p>
	 * 对权限组件路径和请求 URL 进行规范化处理：
	 * <ul>
	 *   <li>去除组件路径前缀中的多余部分，如 "/views/"、"src/views/" 等</li>
	 *   <li>去除组件后缀名 ".vue"</li>
	 *   <li>请求 URL 去除 ".vue" 后缀并自动添加前缀 "/"（除 HTTP/模板表达式外）</li>
	 *   <li>一级菜单若无组件，则默认设置为 "layouts/RouteView"</li>
	 * </ul>
	 * </p>
	 *
	 * @param permission 需要处理的权限对象
	 * @return 处理后的权限对象，若参数为 null 则返回 null
	 */
	public static SysPermission intelligentProcessData(SysPermission permission) {
		if (permission == null) {
			return null;
		}

		// 处理组件路径
		if (oConvertUtils.isNotEmpty(permission.getComponent())) {
			String component = permission.getComponent();
			if (component.startsWith("/")) {
				component = component.substring(1);
			}
			if (component.startsWith("views/")) {
				component = component.replaceFirst("views/", "");
			}
			if (component.startsWith("src/views/")) {
				component = component.replaceFirst("src/views/", "");
			}
			if (component.endsWith(".vue")) {
				component = component.replace(".vue", "");
			}
			permission.setComponent(component);
		}

		// 处理请求 URL
		if (oConvertUtils.isNotEmpty(permission.getUrl())) {
			String url = permission.getUrl();
			if (url.endsWith(".vue")) {
				url = url.replace(".vue", "");
			}
			// 对非 http 开头，且非以 / 或模板表达式开头的，自动加 "/"
			if (!url.startsWith("http") && !url.startsWith("/") && !url.trim().startsWith("{{")) {
				url = "/" + url;
			}
			permission.setUrl(url);
		}

		// 一级菜单默认组件赋值
		if (permission.getMenuType() == 0 && oConvertUtils.isEmpty(permission.getComponent())) {
			permission.setComponent("layouts/RouteView");
		}
		return permission;
	}

	/**
	 * 如果菜单列表中没有“首页”菜单，则新建一个首页菜单并插入列表最前面
	 *
	 * @param metaList 菜单权限列表
	 */
	public static void addIndexPage(List<SysPermission> metaList) {
		boolean hasIndexMenu = false;
		for (SysPermission sysPermission : metaList) {
			if ("首页".equals(sysPermission.getName())) {
				hasIndexMenu = true;
				break;
			}
		}
		if (!hasIndexMenu) {
			// 新建首页菜单，并插入列表开头
			metaList.add(0, new SysPermission(true));
		}
	}

	/**
	 * 判断菜单列表是否包含“首页”菜单
	 *
	 * @param metaList 菜单权限列表
	 * @return 如果存在“首页”菜单返回 true，否则 false
	 */
	public static boolean hasIndexPage(List<SysPermission> metaList) {
		for (SysPermission sysPermission : metaList) {
			if ("首页".equals(sysPermission.getName())) {
				return true;
			}
		}
		return false;
	}
}

